// RBAC权限管理类型定义

// 分页请求类型
export interface PageRequest {
  page: number;
  size: number;
  sort?: string;
  order?: 'asc' | 'desc';
}

// 权限条件类型
export interface PermissionCondition {
  field: string;                    // 条件字段，如 'department', 'status', 'ownerId'
  operator: '=' | '!=' | 'in' | 'not_in' | '>' | '<' | '>=' | '<=' | 'contains';
  value?: any;                      // 条件值（当使用contextField时可选）
  contextField?: string;            // 从上下文获取值的字段名
  description?: string;             // 条件描述
}

// 权限作用域类型
export type PermissionScope = 
  | 'global'        // 全局权限
  | 'organization'  // 组织级权限
  | 'department'    // 部门级权限
  | 'team'          // 团队级权限
  | 'owner'         // 所有者权限
  | 'custom';       // 自定义条件权限

// 权限类型（增强版）- 统一前后端数据结构
export interface Permission {
  id: string;
  code: string;          // 权限代码，如 'user:read'
  name: string;          // 权限名称，如 '查看用户'
  description?: string;  // 权限描述
  category?: string;     // 权限分类，如 'user', 'role', 'system'
  resource?: string;     // 资源类型，如 'user', 'menu', 'api'
  action?: string;       // 操作类型，如 'read', 'write', 'delete'
  
  // 权限类型和层级
  type?: 'menu' | 'button' | 'api' | string;  // 权限类型，兼容字符串和数字
  parentId?: string;     // 父权限ID，支持权限层级
  sort?: number;         // 排序
  
  // 路径和方法
  path?: string;         // API路径或菜单路径
  method?: string;       // HTTP方法
  
  // 前端显示相关
  icon?: string;         // 图标
  component?: string;    // 组件路径
  redirect?: string;     // 重定向路径
  hidden?: boolean;      // 是否隐藏
  alwaysShow?: boolean;  // 是否总是显示
  
  // 元数据
  meta?: {
    title?: string;
    icon?: string;
    noCache?: boolean;
    breadcrumb?: boolean;
    activeMenu?: string;
  };
  
  // 新增的细粒度权限控制字段
  scope?: PermissionScope;           // 权限作用域（可选，向后兼容）
  conditions?: PermissionCondition[]; // 权限条件（可选，向后兼容）
  
  // 权限元数据
  isBuiltin?: boolean;   // 是否为内置权限（默认false）
  priority?: number;     // 权限优先级（默认0）
  status?: 'active' | 'inactive' | number; // 状态：支持字符串和数字格式
  
  // 关联关系
  parent?: Permission;   // 父权限信息
  children?: Permission[]; // 子权限列表
  
  createTime: string;
  updateTime: string;
  createdBy?: string;
}

// 角色类型（匹配后端SysRole实体）
export interface Role {
  id: string;
  roleKey: string;       // 角色代码，如 'admin', 'manager' (对应后端code字段)
  roleName: string;      // 角色名称，如 '管理员', '经理' (对应后端name字段)
  remark?: string;       // 角色描述 (对应后端description字段)
  permissions: string[]; // 角色拥有的权限ID列表
  level?: number;        // 角色级别：1-租户管理员，2-部门管理员，3-团队领导，4-普通用户
  dataScope?: string;    // 数据权限范围：all-全部，dept-部门及以下，dept_only-仅部门，team-团队，owner-个人，custom-自定义
  isBuiltin?: boolean;   // 是否为内置角色
  status: 'active' | 'inactive' | number; // 角色状态：1-启用，0-禁用（兼容字符串和数字）
  sort?: number;         // 排序字段
  userCount?: number;    // 用户数量（前端扩展字段）
  createTime: string;
  updateTime: string;
  createdBy: string;
  // 兼容旧字段名
  code?: string;         // 兼容旧的code字段
  name?: string;         // 兼容旧的name字段
  description?: string;  // 兼容旧的description字段
  // 部门相关字段（继承自BaseDeptEntity）
  deptId?: string;       // 部门ID
  deptName?: string;     // 部门名称
}

// 部门类型（匹配后端SysDepartmentDto）
export interface Department {
  id: string;            // 兼容前端String类型，实际后端为Long
  code: string;          // 部门代码，如 'TECH_DEPT', 'SALES_DEPT'
  name: string;          // 部门名称，如 '技术部', '销售部'
  description?: string;  // 部门描述
  parentId?: string;     // 父部门ID，支持部门层级（后端为Long）
  ancestors?: string;    // 祖级列表（用逗号分隔），如 "0,2000"
  level?: number;        // 部门层级，从1开始（前端计算字段）
  sort?: number;         // 排序
  managerId?: string;    // 部门负责人用户ID（后端为Long）
  status: number | 'active' | 'inactive'; // 状态：1-启用，0-禁用（兼容字符串格式）
  
  // 后端新增字段
  phone?: string;        // 部门电话
  email?: string;        // 部门邮箱
  address?: string;      // 部门地址
  
  // 关联关系（后端DTO包含的关联数据）
  users?: User[];        // 部门用户列表
  teams?: Team[];        // 部门团队列表
  parent?: Department;   // 父部门信息
  children?: Department[]; // 子部门列表
  manager?: User;        // 部门负责人信息
  
  // 前端扩展字段（兼容现有代码）
  memberCount?: number;  // 部门成员数量（前端计算字段）
  
  // 基础字段
  createTime: string;
  updateTime?: string;
  createdBy?: string;
}

// 部门成员类型
export interface DepartmentMember {
  id: string;
  departmentId: string;
  userId: string;
  username: string;
  realName?: string;
  email: string;
  avatar?: string;
  position?: string;     // 职位
  isManager: boolean;    // 是否为部门负责人
  joinTime: string;
  status: 'active' | 'inactive';
}

// 团队类型（重新定义）
export interface Team {
  id: string;
  code: string;          // 团队代码，如 'dev_team', 'sales_team'
  name: string;          // 团队名称，如 '开发团队', '销售团队'
  description?: string;  // 团队描述
  departmentId?: string; // 所属部门ID
  parentId?: string;     // 父团队ID，支持组织架构
  level: number;         // 组织层级
  memberCount: number;   // 成员数量
  status: 'active' | 'inactive' | number; // 状态：支持字符串和数字格式（兼容前后端）
  createTime: string;
  updateTime: string;
  createdBy: string;
}

// 团队成员类型
export interface TeamMember {
  id: string;
  teamId: string;
  userId: string;
  username: string;
  realName?: string;
  email: string;
  avatar?: string;
  position?: string;     // 职位
  isLeader: boolean;     // 是否为团队领导
  joinTime: string;
  status: 'active' | 'inactive';
}

// 用户类型（重新定义，与后端SysUserDto对应）
export interface User {
  id: string;
  username: string;      // 用户名
  email: string;
  realName?: string;     // 真实姓名
  avatar?: string;       // 头像
  phone?: string;
  status: number;        // 1-启用，0-禁用，2-锁定
  gender?: number;       // 1-男，2-女，0-未知
  age?: number;
  description?: string;  // 个人描述
  roles?: Role[];        // 用户直接分配的角色列表
  teams?: Team[];        // 用户所属的团队列表
  departments?: Department[]; // 用户所属部门列表
  permissions?: Permission[]; // 用户权限列表
  menus?: Menu[];        // 用户菜单列表
  lastLoginTime?: string;
  createTime: string;
  updateTime?: string;
}

// 菜单类型（重新定义）
export interface Menu {
  id: string;
  code: string;          // 菜单代码
  name: string;          // 菜单名称
  path?: string;         // 路由路径
  component?: string;    // 组件路径
  icon?: string;         // 图标
  parentId?: string;     // 父菜单ID
  level?: number;        // 菜单层级
  sort?: number;         // 排序
  type: number | 'menu' | 'button' | 'api'; // 菜单类型：1-目录，2-菜单，3-按钮
  permissions?: string | string[]; // 访问此菜单需要的权限标识
  visible?: boolean;     // 是否可见
  status: number | 'active' | 'inactive'; // 状态：1-启用，0-禁用
  description?: string;  // 菜单描述
  children?: Menu[];     // 子菜单
  createTime?: string;
  updateTime?: string;
  createBy?: string;
  updateBy?: string;
}

// 权限计算结果
export interface UserPermissions {
  userId: string;
  directRoles: Role[];        // 用户直接分配的角色
  teamRoles: Role[];          // 从团队继承的角色
  allRoles: Role[];          // 所有角色（去重后）
  allPermissions: Permission[]; // 所有权限（去重后）
  accessibleMenus: Menu[];    // 可访问的菜单
}

// 组织架构节点
export interface OrganizationNode {
  id: string;
  name: string;
  type: 'department' | 'team';
  parentId?: string;
  children?: OrganizationNode[];
  userCount: number;
  level: number;
}

// 部门表单类型（匹配后端SysDepartmentDto创建/更新需求）
export interface DepartmentForm {
  name: string;          // 部门名称，必填
  code: string;          // 部门代码，必填
  description?: string;  // 部门描述，可选
  parentId?: string;     // 父部门ID，可选（后端为Long）
  managerId?: string;    // 部门负责人用户ID，可选（后端为Long）
  sort?: number;         // 排序，可选
  status?: number | 'active' | 'inactive'; // 状态，可选

  // 联系信息
  phone?: string;        // 部门电话
  email?: string;        // 部门邮箱
  address?: string;      // 部门地址
}

// 权限分配表单
export interface PermissionAssignForm {
  targetType: 'user' | 'role' | 'team' | 'department';
  targetId: string;
  permissions: string[];
}

// 角色分配表单
export interface RoleAssignForm {
  targetType: 'user' | 'team' | 'department';
  targetId: string;
  roles: string[];
}

// 权限检查参数
export interface PermissionCheckParams {
  userId: string;
  permissions?: string[];  // 需要的权限
  roles?: string[];       // 需要的角色
  menuPath?: string;      // 菜单路径
}

// 权限检查结果
export interface PermissionCheckResult {
  hasPermission: boolean;
  missingPermissions: string[];
  reason?: string;
}